package xiancheng.volatileyu;

/**
 * 
 * @author Jin Jing
 * 把域声明为volatile的，就是告诉编译器，该域的值在任何时刻都可能改变，而且对编译器不可见。
 * 用了volatile，编译器就不会做优化。
 * 
 * 首先每个线程都有自己一个工作内存区，多个线程共享一个主内存区。线程中的本地变量存在自己的内存区中，
 * 如for（int   i=0；i <100;i++）{this.i=i;}，其中i就存在线程工作内存中，即每个线程都有一个，
 * 不用也不能加volatile关键字,this.i就是共享变量。而共享的变量就存在主内存区里，
 * 但Java线程为了提高效率，会把共享变量拷贝到自己的工作区中，这就产生了变量一致性的问题。 
 *
 * 详见 http://www.ibm.com/developerworks/cn/java/j-jtp06197.html  (还没仔细看)
 * 
 */
public class Test {

	int i = 0, j = 0;	
	
	public void show() {
		System.out.println("i: " + i + " j: " + j);
	}
	
	public void changeValue() {
		i++;
		j++;
	}
	
	public static void main(String[] args) {
		Test test = new Test();
		ThreadA threadA = new ThreadA(test);
		threadA.start();
		ThreadB threadB = new ThreadB(test);
		threadB.start();

	}

}
